uvm testbench简介(作用,结构以及搭建步骤)

您所在的位置:网站首页 uvm test top uvm testbench简介(作用,结构以及搭建步骤)

uvm testbench简介(作用,结构以及搭建步骤)

2024-07-14 21:55| 来源: 网络整理| 查看: 265

参考资料:

(1) 《uvm cookbook》;

(2) 公众号-芯片学堂;

(3) 《uvm user guide》;

(4) 从run_test浅谈Test Bench的启动 (qq.com)

(5) 《practical UVM step by step with IEEE》第二章;

1.uvm tb 1.1 uvm tb作用

(1) 实例化DUT模块以及UVM Test class(通过在tb.sv的initial begin-end块内调用run_test函数实现);

(2) 实现DUT与验证环境的连接(interface binding以及uvm_config_db::set(), uvm_config_db::get());

(3) 时钟产生(复位信号由UVM testbench提供);

注1:需要指明timescale;

注2:时钟生成放到module内部实现,不要在testbench中产生时钟;(《practical UVM step by step with IEEE》2.7章)

1 //tb.sv 2 module tb; 3 my_if input_if(clk, rst_n, **); 4 my_if output_if(clk, rst_n, **); 5 6 dut my_dut(.clk(clk), .rst_n(rst_n), 7 .rxd(input_if.data), .rx_dv(input_if.valid), 8 .txd(output_if.data), .tx_en(output_if.valid), 9 ); 10 11 initial begin 12 run_test(); 13 end 14 15 initial begin 16 uvm_config_db #(virtual my_if)::set(**); 17 uvm_config_db #(virtual my_if)::set(**); 18 end 19 endmodule 1 //top-level testbench; 2 module wb_env_top_mod(); 3 logic clk; 4 parameter sim_cycle=10; 5 parameter rst_delay=5; 6 7 initial begin 8 clk=0; 9 forever clk=#(sim_cycle/2) ~clk; 10 end 11 12 wb_master_if mast_if(clk); 13 wb_slave_if slave_if(clk); 14 15 wb_env_tb_mod test(); 16 dut dut(mast_if, slave_if); 17 18 endmodule: wb_env_top_mod 1 `include "wb_test.pkg" 2 module wb_env_tb_mod; 3 import uvm_pkg::*; 4 import wb_tests::*; 5 6 typedef virtual wb_master_if v_if1; 7 typedef virtual wb_slave_if v_if2; 8 9 initial begin 10 uvm_config_db #(v_if1)::set(null, "uvm_test_top.env.rst_agent", "mst_if", wb_env_top_mod.mast_if); 11 uvm_config_db #(v_if1)::set(null, "uvm_test_top.env.master_agent", "mst_if", wb_env_top_mod.mast_if); 12 uvm_config_db #(v_if2)::set(null, "uvm_test_top.env.slave_agent", "slv_if", wb_env_top_mod.slave_if); 13 run_test(); 14 end 15 16 endmodule: wb_env_tb_mod 1.2 uvm tb框图

2.two top level module testbench(hdl_top & hvl_top)

(1) hdl_top包含interface和DUT;

(2) hvl_top包含启动uvm验证平台的initial begin-end块;

注:详见uvm cookbook;

3.uvm tb搭建具体步骤(需要有如下环节,但顺序可能有所不同) 3.1构建transaction

(1) 作用: DUT激励;

(2) 派生关系: UVM class library提供uvm_sequence_item基类(uvm_sequence_item派生于uvm_transaction);每一个user-defined data item都应该直接或间接派生于uvm_sequence_item;

(3) 创建user-defined transaction:

(3.1) 根据DUT transaction spec,弄清楚专用的约束、任务与函数;

(3.2) 从uvm_sequence_item基类或其派生类构建新的派生类;

(3.3) 定义构造函数;

(3.4) 为transaction类添加成员变量;

(3.5) 使用uvm field宏以便于直接使用print, copy, compare等函数;

(4) 示例

3.2 构建sequence & virtual sequence

详见seq部分文档(声明seq&启动seq);

3.3 构建sequencer & virtual sequencer

详见sequencer部分文档;

3.4 构建driver

(1)作用:从sequencer获取data item,然后按照接口协议把data item驱动到总线上;

(2)派生关系:UVM类库提供uvm_driver基类,所有的driver类都应该直接或间接的派生自uvm_driver;

(3)创建

(3.1) 从uvm_driver类派生;

(3.2) 使用UVM field automation机制实现print, copy, compare等函数的自动定义;

(3.3) 获取来自sequencer的下一个data item;

(3.4) 在driver中声明一个virtual interface,为了实现driver与DUT的连接;

(4)示例

3.5 构建monitor

(1)作用:负责从bus上提取信号信息,转换成事件,数据和状态信息,然后通过TLM port将信息传递给其他uvc;

(2)示例:

3.6 构建agent

(1)作用:实例化driver, monitor, sequencer并采用TLM port实现其连接(为了提高灵活性, agent也会包含配置信息以及其他参数);

 

(2) 工作模式(active mode与passive mode)

(2.1) active mode: agent需要实例化driver, sequencer, monitor;

(2.2) passive mode: agent不需要实例化driver,sequencer,仅仅需要实例化monitor;

(3) 示例

3.7 实现check与coverage收集

(1) assertion check示例

(2) 函数check示例

(3) 功能覆盖率的收集

(3.1) 功能覆盖率的收集是通过sv的covergroup实现的; covergroup的关键在于coverpoint与bin的确定以及什么时候收集覆盖率;

3.8 构建env

(1)作用:可复用组件的容器,它实例化并配置所有的子组件;

(2)示例:

3.9 构建test

篇?-uvm_test - 蚕食鲸吞 - 博客园 (cnblogs.com)

 

 

 

 

 

 

 



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3